Luettelon Web-palvelun yhteystietoja ja näytän sen yhteystietojen 'osioidussa' tableView-näytössä kuvakaappauksessa näkyvällä tavalla. Ongelma on, että saan samat tagiarvot ensimmäisen rivin valintaruuduille sekä osastolle A että osalle S. Olen lajitellut yhden taulukon ja esittänyt indeksoidun taulukon näkymän. Kuinka saada erilaisia tagiarvoja indexPath.row-koodista riippuen näytettyjen osioiden lukumäärästä. Tässä yritin SolussaForRowAtIndexPath: UIButton * checkBox; jos (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPhone) { checkBox = [[UIButton allokointi] initWithFrame: CGRectMake (7, 8, 30, 30)]; } muu { checkBox = [[UIButton allokointi] initWithFrame: CGRectMake (15, 13, 30, 30)]; } // int cnt = 0; // for (int i = indexPath.section - 1; i> 0; i--) // { // cnt + = [[objectForCharacters objectForKey: [arrayOfCharacters objectAtIndex: i]] count]; // arrayOfCharachtersilla on merkit "A" - "Z" //} //checkBox.tag = cnt + indexPath.row; [checkBox setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; [checkBox addTarget: self action: @selector (checkBoxClicked :) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; paluukenno; } - (void) checkBoxClicked: (id) lähettäjä { CGPoint buttonPosition = [lähettäjä convertPoint: CGPointZero toView: self.tableViewContact]; NSIndexPath * indexPath = [self.tableViewContact indexPathForRowAtPoint: buttonPosition]; UIButton * tappedButton = (UIButton *) lähettäjä; NSLog (@ "Tunnisteen numero =% d", [lähettäjän tunniste]); if ([napautettuButton.currentImage isEqual: [UIImage imageNamed: @ "checkBox.png"]]) { [lähettäjä setImage: [UIImage imageNamed: @ "checkBoxMarked.png"] forState: UIControlStateNormal]; jos (indexPath! = Nolla) { NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; // tallenna valintaruutujen tunnukset mutableArrayOfIds-tiedostoon NSLog (@ "Tunnistettu tarkistettu painikkeen tunnus =% @", finalIntId); [arrayOfIds addObject: finalIntId]; } // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: napautettuButton.tag]; // NSString * finalIntId = [mutableArrayOfIds objectAtIndex: indexPath.row]; } muu { [lähettäjä setImage: [UIImage imageNamed: @ "checkBox.png"] forState: UIControlStateNormal]; NSLog (@ "Ei tarkastettu"); // [arrayOfIds removeObjectAtIndex: napautettuButton.tag]; } } - (NSString *) tableView: (UITableView *) tableView titleForHeaderInSection: (NSInteger) -osio { jos ([arrayOfCharacters count] == 0) { paluu @ ""; } return [NSString stringWithFormat: @ "% @", [arrayOfCharacters objectAtIndex: jakso]]; } - (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { NSArray * toBeReturned = [NSArray arrayWithArray: [@ "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | # " componentsSeparatedByString: @ "|"]]; paluuBeReturned; } - (NSInteger) tableView: (UITableView *) tableView sectionForSectionIndexTitle: (NSString *) otsikko atIndex: (NSInteger) -indeksi { NSI-kokonaisluku = 0; for (NSString * merkki arrayOfCharactersissa) { if ([merkki onEqualToString: otsikko]) { paluumäärä; } laskea ++; } paluu 0; } - (NSInteger) numeroOfSectionsInTableView: (UITableView *) tableView { return [arrayOfCharacters count]; // palauttaa 1; } - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) -osio { // return [mutableArray count]; return [[objectForCharacters objectForKey: [arrayOfCharacters objectAtIndex: jakso]] count]; }
2020-12-07 22:55:02
asetat saman tagiarvon kaikille osille, joilla on sama rivi. IndexPathilla on kaksi ominaisuutta, {section, row}. Sanotaan, että osassa A on kaksi riviä, riville1 -> indexPath.section = 0, indexPath.row = 0; riville2-> indexPath.section = 0, indexPath.row = 1; Sanotaan, että osiossa S on kaksi riviä, riville1 -> indexPath.section = 1, indexPath.row = 0; riville2-> indexPath.section = 1, indexPath.row = 1; Joten, määrität osan A riville 1 ja osan S riville 1 saman tagiarvon, joka on 0. On ongelmaasi. Yritä asettaa tagin arvo kuten alla. button.tag = indexPath.section * 1000 + indexPath.row; kun haet osiota ja riviä, NSIegeger -osio = (button.tag) / 1000; NSI kokonaislukurivi = (button.tag)% 1000; | Kokeile tätä... - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { staattinen NSString * CellIdentifier = @ "solu"; UITableViewCell * solu = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; jos (solu == nolla) { solu = [[UITableViewCell-varaus] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; } UIButton * checkBox = [[UIButton allokointi] initWithFrame: CGRectMake (280, 10, 50, 44)]; checkBox.backgroundColor = [UIColor orangeColor]; [checkBox addTarget: self action: @selector (checkBoxClicked: event:) forControlEvents: UIControlEventTouchUpInside]; [checkBox setTag: indexPath.row]; [cell.contentView addSubview: checkBox]; paluukenno; } - (void) checkBoxClicked: (id) lähettäjän tapahtuma: (id) tapahtuma { NSSet * koskettaa = [tapahtuma allTouches]; UITouch * touch = [koskettaa mitä tahansa kohdetta]; CGPoint currentTouchPosition = [kosketussijaintiInView: self.tv]; // tässä tv on TableView-objekti NSIndexPath * indexPath = [self.tv indexPathForRowAtPoint: currentTouchPosition]; NSLog (@ "indePath.section% d: n arvo, indexPath.row% d", indexPath.section, indexPath.row); } | Tämä tapahtuu, koska määrität tagin painikkeille INDEPENDENT osioista. Molemmissa osioiden ensimmäisessä rivissä A & S on rivi = 0. Joten niiden painikkeille on määritetty tagi 0. Sinun tulisi antaa heille Pidä viittaus osioihisi. ehdotan esteettömyysvinkin määrittämistä pilkuilla erotetulla lomakkeella, joka sisältää osion, rivin. Ja omassa menetelmässäsi - (void) checkBoxClicked: (id) lähettäjä { // poimi merkkijono pilkuilla erotetusta muodosta. 1. on osa, toinen on rivi. } Toinen vaihtoehto on tehdä mitä ikinä teet ja toteuttaa Button-menetelmäsi näin. CGPoint buttonPosition = [lähettäjä convertPoint: CGPointZero toView: self.tableView]; NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: buttonPosition]; jos (indexPath! = nolla) { ... indexpath.section on sinun osasi, index path.row on rivisi. } On myös kolmas vaihtoehto. Määritä painikkeellesi cellforRowAtIndexpath-otsikossa otsikko - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath [btn setTitle: <# Rivi #> forState: UIControlStateDisabled]; [btn setTag <#Osa osasi #>]; joten kun vastaanotat painikkeella, sinulla voi olla sekä osio (tunniste) että rivi (otsikko vammaisille). - (void) checkBoxClicked: (id) lähettäjä [[button titleForState: UIControlStateDisabled]; // rivisi button.tag // osastosi} | Kokeile tätä! Jokainen osa, jonka saatat tuntea oikean osan määrän, lisää sitten yksittäisten rivien määrä. [[fieldTitlesList objectAtIndex: indexPath.section - 1] count] + indexPath.row Where fieldTitlesList on osastojesi taulukko. | Lisäsin seuraavan koodin, joka ratkaisi ongelmani NSIegerer rowNumber = 0; varten (NSInteger i = 0; i